/******************************************************************************
 * Arquivo: VeiculoDAOImpl.java                                                           *
 * Autor: Aurindo Jorge Ferreira                                              *
 * e-mail: aurindo@gmail.com                                                  *
 * Data de cria��o: 09/12/2007                                                   *
 *                                                                            *
 * Propriedade de FastFind Solu��es Tecnologicas                              *
 ******************************************************************************/

package br.com.srv.componentes.veiculo.dao.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

import br.com.srv.componentes.jdbcdao.DadosLidoJdbcDAO;
import br.com.srv.componentes.veiculo.dao.VeiculoDAO;
import br.com.srv.model.PontoTO;
import br.com.srv.model.VeiculoTO;
import br.com.srv.util.DateHelper;

public class VeiculoJdbcDAOImpl extends SimpleJdbcDaoSupport 
	implements VeiculoDAO {
	
	DadosLidoJdbcDAO dadosLidoJdbcDAO;

	public boolean bloquearVeiculoById(VeiculoTO veiculoTO) throws Exception {
		// TODO Auto-generated method stub
		return false;
	}

	public List<PontoTO> buscarPosicoes(Integer veiculoId, String dataInicial,
			String horaInicial, String dataFinal, String horaFinal)
			throws Exception {

		List<Map<String, String>> result = getDadosLidoJdbcDAO().consultaPontosByVeiculo(
				veiculoId.toString(), dataInicial, dataFinal, horaInicial, horaFinal);
		
		List<PontoTO> posicoes = new ArrayList<PontoTO>();
		for (Map mapa : result) {
			PontoTO pontoTO = new PontoTO();
			pontoTO.setDataHora((String)mapa.get("DATE_TIME"));
			pontoTO.setLongitude(new Double((String)mapa.get("X")));
			pontoTO.setLatitude(new Double((String)mapa.get("Y")));	
			pontoTO.setVelocidade(new Double((String)mapa.get("VEL")));	
			pontoTO.setDistanciaUltimoPonto(new Double((String)mapa.get("DIST_BETWEEN_POSITIONS")));
			pontoTO.setDescricao((String)mapa.get("NEAR_DESC"));

			pontoTO.setCodMotorista((String)mapa.get("MOTORISTA"));

			posicoes.add(pontoTO);
		}
		
		return posicoes;
		
	}

	public boolean desbloquearVeiculoById(VeiculoTO veiculoTO) throws Exception {
		// TODO Auto-generated method stub
		return false;
	}

	public List<Map<String, String>> buscarUltimasPosicaoVeiculos(List<String> idVeiculos)
			throws Exception {
		
    	String stringVeiculosId = prepararStringVeiculos(idVeiculos);
		
		String query = "select ult_dado.vei_id, veiculo.vei_dsc, ult_dado.udl_dh, ponto.ptp_dsc, "
			+ "ult_dado.udl_pdis, ult_dado.udl_lat, ult_dado.udl_lng, ult_dado.udl_vel, ult_dado.udl_byt1, ult_dado.udl_mot_id "
			+ "from ult_dado_lido ult_dado, veiculo veiculo, ponto ponto "
			+ "where ult_dado.vei_id in (" + stringVeiculosId + ") and ult_dado.vei_id = veiculo.vei_id and ult_dado.ptp_id = ponto.ptp_id";

		Object params[] = {};
		
		List<Map<String, String>> ultimosPontos = getJdbcTemplate().query(query, params, new UltimosPontosMapper());
		
		return ultimosPontos;
		
	}
	
    private static class UltimosPontosMapper implements RowMapper {

		public Map<String, String> mapRow(ResultSet rs, int rowNum) throws SQLException {
			Map<String, String> ultimoPonto = new HashMap<String, String>();
			ultimoPonto.put("ID", rs.getString("vei_id"));
			ultimoPonto.put("DESC", rs.getString("vei_dsc"));
			ultimoPonto.put("DATE_TIME", DateHelper.ajustarHora(rs.getTimestamp("udl_dh"), -3));
			ultimoPonto.put("NEAR_DESC", rs.getString("ptp_dsc"));
			ultimoPonto.put("NEAR_DIST", rs.getString("udl_pdis"));
			ultimoPonto.put("Y", rs.getString("udl_lat"));
			ultimoPonto.put("X", rs.getString("udl_lng"));
			ultimoPonto.put("VEL", rs.getString("udl_vel"));
			
			Byte b = new Byte(rs.getByte("udl_byt1"));
			String ignicao = VeiculoDAO.IGNICAO_DESLIGADO;
			if (b.intValue() > 0) {
				ignicao = VeiculoDAO.IGNICAO_LIGADO;
			} else {
				ignicao = VeiculoDAO.IGNICAO_DESLIGADO;
			}
			
			ultimoPonto.put("IGNITION", ignicao);
			ultimoPonto.put("MOTORISTA", rs.getString("udl_mot_id"));
			return ultimoPonto;
		}

    }

	private static String prepararStringVeiculos(List<String> idVeiculos) {
		String teste = "";
    	
    	int count = 0;
    	
    	for (String veiculoId : idVeiculos) {
    		if (count > 0) {
    			teste += ",";    			
    		}
			teste += veiculoId;
			count++;
		}
		return teste;
	}

	public DadosLidoJdbcDAO getDadosLidoJdbcDAO() {
		return dadosLidoJdbcDAO;
	}

	public void setDadosLidoJdbcDAO(DadosLidoJdbcDAO dadosLidoJdbcDAO) {
		this.dadosLidoJdbcDAO = dadosLidoJdbcDAO;
	}

	public String buscarSerialbyId(String veiculoId) {
		
		String query = "SELECT EQP_SRN FROM veiculo WHERE VEI_ID = " + veiculoId;
		
		String result = null;
		try {
			result = (String)getJdbcTemplate().queryForObject(query, String.class);
		} catch (IncorrectResultSizeDataAccessException e) {
			//fazer nada.
		}
		
		return result;
	}
	
	
}
